iT邦幫忙

2024 iThome 鐵人賽

DAY 16
0
Software Development

十年後重讀作業系統恐龍本系列 第 16

ch5-POSIX未命名信號量(Unnamed Semaphores)

  • 分享至 

  • xImage
  •  

Process-Scheduling 詳細的文字整理請參考 作業系統 Ch5 Process-Scheduling

POSIX 未命名信號量(Unnamed Semaphores)是一種用於進程間或執行緒間同步的機制。它們是 POSIX 標準的一部分,允許在不需要命名的情況下使用信號量來控制對共享資源的訪問。

特點

  1. 未命名

    • 未命名信號量與命名信號量不同,未命名信號量不需要在文件系統中創建一個名稱。它們通常是作為變數在記憶體中直接使用,適合於同一進程內的多執行緒同步。
  2. 進程內或進程間同步

    • 未命名信號量可以用於同一進程內的多執行緒同步,也可以用於共享記憶體的多進程同步。
  3. 初始化和銷毀

    • 使用 sem_init 來初始化未命名信號量,並使用 sem_destroy 來銷毀它們。
  4. 操作

    • 使用 sem_wait 來減少信號量(進入臨界區),如果信號量的值為 0,則會阻塞。
    • 使用 sem_post 來增加信號量(離開臨界區),這可能會喚醒正在等待的執行緒或進程。

使用範例

posix-unnamed-sem.c

/**
 * Example illustrating POSIX unnamed semaphores
 *
 * Compilation (on Linux):
 *
 *	gcc -lpthread posix-unnamed-sem.c
 *
 * This example includes the appropriate error checking
 * that is not covered in the text.
 *
 * Note that OS X does not support unnamed sempahores
 * so this program will not work on those systems.
 *
 * Operating System Concepts - Ninth Edition
 * John Wiley & Sons - 2013.
 */

#include <unistd.h>     
#include <sys/types.h>  
#include <errno.h>      
#include <stdio.h>      
#include <stdlib.h>     
#include <pthread.h>    
#include <string.h>     
#include <semaphore.h>  

int main(void)
{
sem_t sem;

    /* 初始化信號量 sem。
    第一個參數是指向信號量的指標。
    第二個參數 0 表示這是一個進程內的信號量。
    第三個參數 1 是信號量的初始值,表示資源可用;0 表示不可用。*/
    if (sem_init(&sem,0,1) == -1)
        printf("%s\n",strerror(errno));

    /* 嘗試獲取信號量,如果信號量的值大於 0,它會減少信號量的值並進入臨界區。如果信號量的值為 0,則會阻塞,直到信號量的值大於 0。 */
    if (sem_wait(&sem) != 0)
        printf("%s\n",strerror(errno));

    printf("*** Critical Section *** \n");

    /* 釋放信號量,增加信號量的值 */
    if (sem_post(&sem) != 0)
        printf("%s\n",strerror(errno));

    printf("*** Non-Critical Section *** \n");

    /* 銷毀信號量,釋放其資源。 */
    if (sem_destroy(&sem) != 0)
        printf("%s\n",strerror(errno));

    return 0;
}

Terminal
編譯並執行

gcc -lpthread posix-unnamed-sem.c
./a.out

結果:
https://ithelp.ithome.com.tw/upload/images/20240930/20168766wxflDBiggF.png

優點

  • 簡單易用:未命名信號量不需要文件系統支持,簡化了使用過程。
  • 效率高:適合於同一進程內的多執行緒同步,因為不需要跨進程通信。

限制

  • 不支持跨主機同步:未命名信號量不能用於多個主機間的同步。
  • 不適合長期使用:由於它們在程序結束時不會自動銷毀,因此需要手動銷毀。

未命名信號量提供了一種簡單而有效的方法來管理多執行緒或多進程間的同步,是 POSIX 標準中一個重要的同步工具。

參考:文字參考AI,程式部分 greggagne/OSC9e/ch5/posix-unnamed-sem.c


上一篇
ch4-OpenMP例子
下一篇
ch5-POSIX命名信號量(Named Semaphores)
系列文
十年後重讀作業系統恐龍本30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言